//
//  WBComposeTextView.swift
//  Weibo
//
//  Created by cc on 11/6/17.
//  Copyright © 2017 cc. All rights reserved.
//

import UIKit


/// 撰写微博的文本视图
class WBComposeTextView: UITextView {
    
    private lazy var placeholderLabel = UILabel()
    
    override func awakeFromNib() {
        setupUI()
    }
    
    deinit {
        //注销通知
        NotificationCenter.default.removeObserver(self)
    }
    
    
    //MARK: -监听方法
    @objc private func textChange() {
        //如果有文本，不显示占位标签，否则显示
        placeholderLabel.isHidden = self.hasText
    }
}


// MARK: - 表情键盘专属方法
extension WBComposeTextView {
    

    
    ///返回textView对应的纯文本字符串[将属性图片转换成文字]
    var emoticonText: String{
        //1.获取textView的属性文本
        guard let attrStr = attributedText else{
            return ""
        }
        
        //2.需要获得属性文本的图片[附件 Attachment]
        
        /*
            1.遍历的范围
            2.选项[]
            3.闭包
         */
        
        var result = String()
        attrStr.enumerateAttributes(in: NSRange(location: 0, length: attrStr.length), options: []) { (dict, range, _) in
            if let attachment = dict[.attachment] as? CZEmoticonAttachment {
                result += attachment.chs ?? ""
            } else {
                let subStr = (attrStr.string as NSString).substring(with: range)
                
                result += subStr
            }
            
        }
        
        return result
    }
    
    
    
    
    
    ///向文本视图插入表情符号[图文混排]
    ///
    /// - Parameter em: 选中的表情符号，nil表示删除
    func insertEmoticon(em: CZEmoticon?) {
        //1. em == nil 是 删除按钮
        guard let em = em else {
            //删除文本
            deleteBackward()
            
            return
        }
        
        //2. emoji 字符串
        if let emoji = em.emoji, let textRange = selectedTextRange {
            // UITextRange仅用于此
            replace(textRange, withText: emoji)
            
            return
        }
        
        
        //代码执行到此处，都是图片表情
        //0.获取表情中的图像属性文本
        //所有排版系统中。几乎有一个共同的特点，插入的字符的显示，跟随前一个字符的属性，但是本身没有`属性`
        
        let imageText = em.imageText(font: font!)
        
        //1> 获取当前 textView 属性文本 => 可变的
        let attrStrM = NSMutableAttributedString(attributedString: attributedText)
        
        //2> 将图像的属性文本插入当前的光标位置
        attrStrM.replaceCharacters(in: selectedRange, with: imageText)
        
        //3> 重新设置属性文本
        //记录光标位置
        let range = selectedRange
        
        //设置文本
        attributedText = attrStrM
        
        //恢复光标位置，length 是选中字符的长度，插入文本后应该为0
        selectedRange = NSRange(location: range.location + 1, length: 0)
        
        //4.让代理执行文本变化方法
        delegate?.textViewDidChange?(self)
        
        //5. 执行当前对你的文本变化方法
        textChange()
        
    }
    
}



private extension WBComposeTextView {
    func setupUI() {
        //0.注册通知 - 通知是一对多，如果其他控件监听当前文本视图通知，不会影响
        // 如果使用代理，其他控件就无法使用代理监听通知
        NotificationCenter.default.addObserver(self, selector: #selector(textChange), name: NSNotification.Name.UITextViewTextDidChange, object: self)
        
        //1.设置占位标签
        placeholderLabel.text = "分享新鲜事..."
        placeholderLabel.font = self.font
        placeholderLabel.textColor = UIColor.lightGray
        placeholderLabel.frame.origin = CGPoint(x: 5, y: 8)
        
        
        placeholderLabel.sizeToFit()
        
        addSubview(placeholderLabel)
        
        
        //2.测试代理
//        self.delegate = self
        
        
        
    }
}
